library(psych)
library(corrplot)
library(dplyr)
library(tidyverse)
library(stringr)
library(base)
library(sf)
library(scales)
library(vars)
library(lattice)
library(urca)
library(ggplot2)
library(MASS)
library(haven)
library(joineR)
Loading required package: survival
library(pROC)
Type 'citation("pROC")' for a citation.
Attaching package: ‘pROC’
The following objects are masked from ‘package:stats’:
cov, smooth, var
library(MESS)
Attaching package: ‘MESS’
The following object is masked from ‘package:pROC’:
auc
library(arules)
Loading required package: Matrix
Attaching package: ‘Matrix’
The following objects are masked from ‘package:tidyr’:
expand, pack, unpack
Attaching package: ‘arules’
The following object is masked from ‘package:dplyr’:
recode
The following objects are masked from ‘package:base’:
abbreviate, write
read file
data=read.csv('new_data.csv')
Data exploration
There are 12 variables in the data with 485 observations. Including 1
date variable, 2 response variables, and 9 predictors. All variables are
numeric type except variale ‘date’. 1. date 2. new_cases: the daily new
confirmed COVID cases in Netherlands 3. new_deaths: the daily new deaths
of COVID patients in Netherlands 4. ICU_patients: the COVID patients
admitted to ICU per day in hospital 5. Hosp_patients: the COVID patients
admitted to hosptial per day 6. stringency_index: 7. temp: daily
temperature 8. humidity: daily humidity 9. precip: the amount of rains
per day 10. windspeed: daily windspeed 11. transit_stations: 12:
residential:
问题: transit 都是负数,需不需要调整从0开始
判断人们乘坐交通的变化
checking missingness
sum(is.na(data$hosp_patients))
[1] 9
There are 18 missing values in the data, locate in ICU patients and
Hospital patients columns. (The government website does not have COVID
records for some days during 2021- 2022)
correlations

For hospital admission 1.hospital admission and humidity, hospital
admission and precipitation have small correlation less than 0.1
2.hospital admission and new deaths, hospital admission and resident are
highly positive correlated 3.hospital admission and temperature,
hospital admission and transit are highly negative correlated
for hospital admission: fit var model including all variables,
comparing to the var model without humidity, precipitation, and wind
speed.
For ICU admission 1.ICU admission and humidity, ICU admission and
precipitation, ICU and wind speed have small correlation less than 0.1.
2.ICU admission and new deaths, ICU admission and stringency, ICU
admission and resident are highly positive correlated 3.ICU admission
and temperature, ICU admission and transit are highly negative
correlated
for ICU admission: fit var model including all variables, comparing
to the var model without humidity, precipitation and wind speed.
new deaths highly positive correlated to stringency_index, and
residential. Negative correlated to temperature and public
transition.
strigency_index increases, residential increases, transition
decreases. (temperature has opposite relation)
transit and residential as highly negative correlated.
Plots
plot(data$new_cases) # 2022-02-07 has 380399 cases, (outlier, remove and graph again) volatity

plot(data$new_cases[-403])

plot(data$new_deaths)

# more deaths at the beginning
plot(data$icu_patients)

plot(data$hosp_patients)

plot(data$stringency_index)

plot(data$temp)

plot(data$humidity)

plot(data$precip)

plot(data$windspeed)

plot(data$transit_stations)

plot(data$residential)

# ICU, hosp, stringency, residential trends are similar, transition has opposite trend.
stringency 会导致lockdown, residential的变化和stringency相似,
从而影响hosp admission。
summer low COVID, winter high COVID 湿度看着和hosp admission,
icu走势有点像, 风速和降雨量看不出来。
distribution
hist(data$icu_patients)
hist(data$hosp_patients)
hist(data$new_cases)
hist(data$new_deaths)
hist(data$stringency_index)
hist(data$temp)
hist(data$humidity)
hist(data$precip)
hist(data$windspeed)
hist(data$transit_stations)
hist(data$residential)
heteroscedasticity
lm1=lm(hosp_patients~., data=data[,c(2,3,5,6,7,8,9,10,11,12)])
summary(lm1)
# number of new deaths, temperature, humidity, and residential have significant impact on hospital admission.
# new deaths increases, more hospital admissions
# temperature and humidity get higher, the less hospital admission
# hospital admission increases as residential increases.
plot(lm1)
# heteroscedasticity detected, maybe garch model can be used in time series model (further hetero test need to be done)
如果将温度, 湿度, 风速降雨量等调整为categorical数据,
是否能观察出相关性
data_cat=data
data_cat$temp_cat_int <- discretize(data_cat$temp, method="interval", breaks=4)
data_cat$temp_cat_fre <- discretize(data_cat$temp, method="frequency", breaks=4)
data_cat$temp_cat_clu <- discretize(data_cat$temp, method="cluster", breaks=4) #KNN
summary(data_cat$temp_cat_int)
summary(data_cat$temp_cat_fre)
summary(data_cat$temp_cat_clu)
# based on discretization, we used 3 different method to categorize the temperature into 5 level, select the result from KNN model
# [-6,4): cold
# [4,9):cool
# [9,14): warm
# [14,23]: hot
data_cat$wind_cat_int <- discretize(data_cat$windspeed, method="interval", breaks=4)
data_cat$wind_cat_fre <- discretize(data_cat$windspeed, method="frequency", breaks=4)
data_cat$wind_cat_clu <- discretize(data_cat$windspeed, method="cluster", breaks=4) #KNN
summary(data_cat$wind_cat_int)
summary(data_cat$wind_cat_fre)
summary(data_cat$wind_cat_clu)
#[7.6,19.5):low
#[19.5,29): mid
#[29,43.4): strong
#[43.4,82.5]: very strong
data_cat$pre_cat_int <- discretize(data_cat$precip, method="interval", breaks=4)
data_cat$pre_cat_fre <- discretize(data_cat$precip, method="frequency", breaks=4)
data_cat$pre_cat_clu <- discretize(data_cat$precip, method="cluster", breaks=4) #KNN
summary(data_cat$pre_cat_int)
summary(data_cat$pre_cat_fre)
summary(data_cat$pre_cat_clu)
data_cat$hum_cat_int <- discretize(data_cat$humidity, method="interval", breaks=4)
data_cat$hum_cat_fre <- discretize(data_cat$humidity, method="frequency", breaks=4)
data_cat$hum_cat_clu <- discretize(data_cat$humidity, method="cluster", breaks=4) #KNN
summary(data_cat$hum_cat_int)
summary(data_cat$hum_cat_fre)
summary(data_cat$hum_cat_clu)
#[46.6,68.4): level 1
#[68.4,79.8): level 2
#[79.8,88.3): level 3
#[88.3,98.8]: level 4
convert the numerical variables into categorical variables
data_cat$temp_cat=ifelse(data$temp<4, 'cold',
ifelse(data$temp<9, 'cool',
ifelse(data$temp<14, 'warm', 'hot')))
data_cat$wind_cat=ifelse(data$windspeed<19.5, 'low',
ifelse(data$windspeed<29, 'mid',
ifelse(data$windspeed<43.5, 'high', 'strong')))
plot the categorical variables vs number of hospital patients

fit a lm using categorical data
lm2=lm(hosp_patients~., data=data_cat[, c(2,3,5,6,11,12, 25, 26)])
summary(lm2)
# when temperature is higher than 9 degrees, it has an effect on the COVID hospital admission.
# wind does not have an impact on hospital admission
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQpgYGB7cn0KbGlicmFyeShwc3ljaCkKbGlicmFyeShjb3JycGxvdCkKbGlicmFyeShkcGx5cikKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoc3RyaW5ncikKbGlicmFyeShiYXNlKQpsaWJyYXJ5KHNmKQpsaWJyYXJ5KHNjYWxlcykKbGlicmFyeSh2YXJzKQpsaWJyYXJ5KGxhdHRpY2UpCmxpYnJhcnkodXJjYSkKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KE1BU1MpCmxpYnJhcnkoaGF2ZW4pCmxpYnJhcnkoam9pbmVSKQpsaWJyYXJ5KHBST0MpCmxpYnJhcnkoTUVTUykKbGlicmFyeShhcnVsZXMpCmBgYAoKIyByZWFkIGZpbGUKYGBge3J9CmRhdGE9cmVhZC5jc3YoJ25ld19kYXRhLmNzdicpCmBgYAoKIyBEYXRhIGV4cGxvcmF0aW9uCmBgYHtyfQpkZXNjcmliZShkYXRhKQpgYGAKVGhlcmUgYXJlIDEyIHZhcmlhYmxlcyBpbiB0aGUgZGF0YSB3aXRoIDQ4NSBvYnNlcnZhdGlvbnMuIEluY2x1ZGluZyAxIGRhdGUgdmFyaWFibGUsIDIgcmVzcG9uc2UgdmFyaWFibGVzLCBhbmQgOSBwcmVkaWN0b3JzLiBBbGwgdmFyaWFibGVzIGFyZSBudW1lcmljIHR5cGUgZXhjZXB0IHZhcmlhbGUgJ2RhdGUnLiAKMS4gZGF0ZQoyLiBuZXdfY2FzZXM6IHRoZSBkYWlseSBuZXcgY29uZmlybWVkIENPVklEIGNhc2VzIGluIE5ldGhlcmxhbmRzCjMuIG5ld19kZWF0aHM6IHRoZSBkYWlseSBuZXcgZGVhdGhzIG9mIENPVklEIHBhdGllbnRzIGluIE5ldGhlcmxhbmRzCjQuIElDVV9wYXRpZW50czogdGhlIENPVklEIHBhdGllbnRzIGFkbWl0dGVkIHRvIElDVSBwZXIgZGF5IGluIGhvc3BpdGFsCjUuIEhvc3BfcGF0aWVudHM6IHRoZSBDT1ZJRCBwYXRpZW50cyBhZG1pdHRlZCB0byBob3NwdGlhbCBwZXIgZGF5CjYuIHN0cmluZ2VuY3lfaW5kZXg6CjcuIHRlbXA6IGRhaWx5IHRlbXBlcmF0dXJlCjguIGh1bWlkaXR5OiBkYWlseSBodW1pZGl0eQo5LiBwcmVjaXA6IHRoZSBhbW91bnQgb2YgcmFpbnMgcGVyIGRheQoxMC4gd2luZHNwZWVkOiBkYWlseSB3aW5kc3BlZWQKMTEuIHRyYW5zaXRfc3RhdGlvbnM6CjEyOiByZXNpZGVudGlhbDoKCumXrumimO+8miB0cmFuc2l0IOmDveaYr+i0n+aVsO+8jOmcgOS4jemcgOimgeiwg+aVtOS7jjDlvIDlp4sg5Yik5pat5Lq65Lus5LmY5Z2Q5Lqk6YCa55qE5Y+Y5YyWCgoKIyMgY2hlY2tpbmcgbWlzc2luZ25lc3MKYGBge3J9CnN1bShpcy5uYShkYXRhKSkKc3VtKGlzLm5hKGRhdGEkaWN1X3BhdGllbnRzKSkKc3VtKGlzLm5hKGRhdGEkaG9zcF9wYXRpZW50cykpCmBgYApUaGVyZSBhcmUgMTggbWlzc2luZyB2YWx1ZXMgaW4gdGhlIGRhdGEsIGxvY2F0ZSBpbiBJQ1UgcGF0aWVudHMgYW5kIEhvc3BpdGFsIHBhdGllbnRzIGNvbHVtbnMuIChUaGUgZ292ZXJubWVudCB3ZWJzaXRlIGRvZXMgbm90IGhhdmUgQ09WSUQgcmVjb3JkcyBmb3Igc29tZSBkYXlzIGR1cmluZyAyMDIxLSAyMDIyKQoKIyMgY29ycmVsYXRpb25zIApgYGB7cn0KcGFpcnMoZGF0YVssIDI6Nl0pCgpjb3IoZGF0YVssIDI6MTJdKQoKY29ycnBsb3QoY29yKGRhdGFbLCAyOjEyXSksIG1ldGhvZCA9ICJjaXJjbGUiLAogICAgICAgIHRpdGxlID0gIm1ldGhvZCA9ICdjaXJjbGUnIikgCmBgYAoKRm9yIGhvc3BpdGFsIGFkbWlzc2lvbgoxLmhvc3BpdGFsIGFkbWlzc2lvbiBhbmQgaHVtaWRpdHksIGhvc3BpdGFsIGFkbWlzc2lvbiBhbmQgcHJlY2lwaXRhdGlvbiBoYXZlIHNtYWxsIGNvcnJlbGF0aW9uIGxlc3MgdGhhbiAwLjEKMi5ob3NwaXRhbCBhZG1pc3Npb24gYW5kIG5ldyBkZWF0aHMsIGhvc3BpdGFsIGFkbWlzc2lvbiBhbmQgcmVzaWRlbnQgYXJlIGhpZ2hseSBwb3NpdGl2ZSBjb3JyZWxhdGVkIAozLmhvc3BpdGFsIGFkbWlzc2lvbiBhbmQgdGVtcGVyYXR1cmUsIGhvc3BpdGFsIGFkbWlzc2lvbiBhbmQgdHJhbnNpdCBhcmUgaGlnaGx5IG5lZ2F0aXZlIGNvcnJlbGF0ZWQKCmZvciBob3NwaXRhbCBhZG1pc3Npb246IGZpdCB2YXIgbW9kZWwgaW5jbHVkaW5nIGFsbCB2YXJpYWJsZXMsIGNvbXBhcmluZyB0byB0aGUgdmFyIG1vZGVsIHdpdGhvdXQgaHVtaWRpdHksIHByZWNpcGl0YXRpb24sIGFuZCB3aW5kIHNwZWVkLgoKCgpGb3IgSUNVIGFkbWlzc2lvbgoxLklDVSBhZG1pc3Npb24gYW5kIGh1bWlkaXR5LCBJQ1UgYWRtaXNzaW9uIGFuZCBwcmVjaXBpdGF0aW9uLCBJQ1UgYW5kIHdpbmQgc3BlZWQgaGF2ZSBzbWFsbCBjb3JyZWxhdGlvbiBsZXNzIHRoYW4gMC4xLgoyLklDVSBhZG1pc3Npb24gYW5kIG5ldyBkZWF0aHMsIElDVSBhZG1pc3Npb24gYW5kIHN0cmluZ2VuY3ksIElDVSBhZG1pc3Npb24gYW5kIHJlc2lkZW50IGFyZSBoaWdobHkgcG9zaXRpdmUgY29ycmVsYXRlZCAKMy5JQ1UgYWRtaXNzaW9uIGFuZCB0ZW1wZXJhdHVyZSwgSUNVIGFkbWlzc2lvbiBhbmQgdHJhbnNpdCBhcmUgaGlnaGx5IG5lZ2F0aXZlIGNvcnJlbGF0ZWQKCmZvciBJQ1UgYWRtaXNzaW9uOiBmaXQgdmFyIG1vZGVsIGluY2x1ZGluZyBhbGwgdmFyaWFibGVzLCBjb21wYXJpbmcgdG8gdGhlIHZhciBtb2RlbCB3aXRob3V0IGh1bWlkaXR5LCBwcmVjaXBpdGF0aW9uIGFuZCB3aW5kIHNwZWVkLgoKCm5ldyBkZWF0aHMgaGlnaGx5IHBvc2l0aXZlIGNvcnJlbGF0ZWQgdG8gc3RyaW5nZW5jeV9pbmRleCwgYW5kIHJlc2lkZW50aWFsLiBOZWdhdGl2ZSBjb3JyZWxhdGVkIHRvIHRlbXBlcmF0dXJlIGFuZCBwdWJsaWMgdHJhbnNpdGlvbi4KCnN0cmlnZW5jeV9pbmRleCBpbmNyZWFzZXMsIHJlc2lkZW50aWFsIGluY3JlYXNlcywgdHJhbnNpdGlvbiBkZWNyZWFzZXMuICh0ZW1wZXJhdHVyZSBoYXMgb3Bwb3NpdGUgcmVsYXRpb24pCgp0cmFuc2l0IGFuZCByZXNpZGVudGlhbCBhcyBoaWdobHkgbmVnYXRpdmUgY29ycmVsYXRlZC4KCiMgUGxvdHMKYGBge3J9CnBsb3QoZGF0YSRuZXdfY2FzZXMpICMgMjAyMi0wMi0wNyBoYXMgMzgwMzk5IGNhc2VzLCAob3V0bGllciwgcmVtb3ZlIGFuZCBncmFwaCBhZ2Fpbikgdm9sYXRpdHkKcGxvdChkYXRhJG5ld19jYXNlc1stNDAzXSkKcGxvdChkYXRhJG5ld19kZWF0aHMpCiMgbW9yZSBkZWF0aHMgYXQgdGhlIGJlZ2lubmluZyAKcGxvdChkYXRhJGljdV9wYXRpZW50cykKcGxvdChkYXRhJGhvc3BfcGF0aWVudHMpCnBsb3QoZGF0YSRzdHJpbmdlbmN5X2luZGV4KQpwbG90KGRhdGEkdGVtcCkKcGxvdChkYXRhJGh1bWlkaXR5KQpwbG90KGRhdGEkcHJlY2lwKQpwbG90KGRhdGEkd2luZHNwZWVkKQpwbG90KGRhdGEkdHJhbnNpdF9zdGF0aW9ucykKcGxvdChkYXRhJHJlc2lkZW50aWFsKQojIElDVSwgaG9zcCwgc3RyaW5nZW5jeSwgcmVzaWRlbnRpYWwgdHJlbmRzIGFyZSBzaW1pbGFyLCB0cmFuc2l0aW9uIGhhcyBvcHBvc2l0ZSB0cmVuZC4KCmBgYAoKc3RyaW5nZW5jeSDkvJrlr7zoh7Rsb2NrZG93bu+8jCByZXNpZGVudGlhbOeahOWPmOWMluWSjHN0cmluZ2VuY3nnm7jkvLzvvIwg5LuO6ICM5b2x5ZONaG9zcCBhZG1pc3Npb27jgIIKCgoKc3VtbWVyIGxvdyBDT1ZJRCwgd2ludGVyIGhpZ2ggQ09WSUQK5rm/5bqm55yL552A5ZKMaG9zcCBhZG1pc3Npb27vvIwgaWN16LWw5Yq/5pyJ54K55YOP77yMIOmjjumAn+WSjOmZjembqOmHj+eci+S4jeWHuuadpeOAggoKCiMgZGlzdHJpYnV0aW9uCmBgYHtyfQpoaXN0KGRhdGEkaWN1X3BhdGllbnRzKQpoaXN0KGRhdGEkaG9zcF9wYXRpZW50cykKaGlzdChkYXRhJG5ld19jYXNlcykKaGlzdChkYXRhJG5ld19kZWF0aHMpCmhpc3QoZGF0YSRzdHJpbmdlbmN5X2luZGV4KQpoaXN0KGRhdGEkdGVtcCkKaGlzdChkYXRhJGh1bWlkaXR5KQpoaXN0KGRhdGEkcHJlY2lwKQpoaXN0KGRhdGEkd2luZHNwZWVkKQpoaXN0KGRhdGEkdHJhbnNpdF9zdGF0aW9ucykKaGlzdChkYXRhJHJlc2lkZW50aWFsKQpgYGAKCiMgaGV0ZXJvc2NlZGFzdGljaXR5IApgYGB7cn0KbG0xPWxtKGhvc3BfcGF0aWVudHN+LiwgZGF0YT1kYXRhWyxjKDIsMyw1LDYsNyw4LDksMTAsMTEsMTIpXSkKc3VtbWFyeShsbTEpCiMgbnVtYmVyIG9mIG5ldyBkZWF0aHMsIHRlbXBlcmF0dXJlLCBodW1pZGl0eSwgYW5kIHJlc2lkZW50aWFsIGhhdmUgc2lnbmlmaWNhbnQgaW1wYWN0IG9uIGhvc3BpdGFsIGFkbWlzc2lvbi4KIyBuZXcgZGVhdGhzIGluY3JlYXNlcywgbW9yZSBob3NwaXRhbCBhZG1pc3Npb25zCiMgdGVtcGVyYXR1cmUgYW5kIGh1bWlkaXR5IGdldCBoaWdoZXIsIHRoZSBsZXNzIGhvc3BpdGFsIGFkbWlzc2lvbgojIGhvc3BpdGFsIGFkbWlzc2lvbiBpbmNyZWFzZXMgYXMgcmVzaWRlbnRpYWwgaW5jcmVhc2VzLgoKcGxvdChsbTEpCiMgaGV0ZXJvc2NlZGFzdGljaXR5IGRldGVjdGVkLCBtYXliZSBnYXJjaCBtb2RlbCBjYW4gYmUgdXNlZCBpbiB0aW1lIHNlcmllcyBtb2RlbCAoZnVydGhlciBoZXRlcm8gdGVzdCBuZWVkIHRvIGJlIGRvbmUpCmBgYAoKCiMg5aaC5p6c5bCG5rip5bqm77yMIOa5v+W6pu+8jCDpo47pgJ/pmY3pm6jph4/nrYnosIPmlbTkuLpjYXRlZ29yaWNhbOaVsOaNru+8jCDmmK/lkKbog73op4Llr5/lh7rnm7jlhbPmgKcKYGBge3J9CmRhdGFfY2F0PWRhdGEKZGF0YV9jYXQkdGVtcF9jYXRfaW50IDwtIGRpc2NyZXRpemUoZGF0YV9jYXQkdGVtcCwgbWV0aG9kPSJpbnRlcnZhbCIsIGJyZWFrcz00KQpkYXRhX2NhdCR0ZW1wX2NhdF9mcmUgPC0gZGlzY3JldGl6ZShkYXRhX2NhdCR0ZW1wLCBtZXRob2Q9ImZyZXF1ZW5jeSIsIGJyZWFrcz00KQpkYXRhX2NhdCR0ZW1wX2NhdF9jbHUgPC0gZGlzY3JldGl6ZShkYXRhX2NhdCR0ZW1wLCBtZXRob2Q9ImNsdXN0ZXIiLCBicmVha3M9NCkgI0tOTgpzdW1tYXJ5KGRhdGFfY2F0JHRlbXBfY2F0X2ludCkKc3VtbWFyeShkYXRhX2NhdCR0ZW1wX2NhdF9mcmUpCnN1bW1hcnkoZGF0YV9jYXQkdGVtcF9jYXRfY2x1KQojIGJhc2VkIG9uIGRpc2NyZXRpemF0aW9uLCB3ZSB1c2VkIDMgZGlmZmVyZW50IG1ldGhvZCB0byBjYXRlZ29yaXplIHRoZSB0ZW1wZXJhdHVyZSBpbnRvIDUgbGV2ZWwsIHNlbGVjdCB0aGUgcmVzdWx0IGZyb20gS05OIG1vZGVsCiMgWy02LDQpOiBjb2xkCiMgWzQsOSnvvJpjb29sCiMgWzksMTQp77yaIHdhcm0KIyBbMTQsMjNd77yaIGhvdAoKZGF0YV9jYXQkd2luZF9jYXRfaW50IDwtIGRpc2NyZXRpemUoZGF0YV9jYXQkd2luZHNwZWVkLCBtZXRob2Q9ImludGVydmFsIiwgYnJlYWtzPTQpCmRhdGFfY2F0JHdpbmRfY2F0X2ZyZSA8LSBkaXNjcmV0aXplKGRhdGFfY2F0JHdpbmRzcGVlZCwgbWV0aG9kPSJmcmVxdWVuY3kiLCBicmVha3M9NCkKZGF0YV9jYXQkd2luZF9jYXRfY2x1IDwtIGRpc2NyZXRpemUoZGF0YV9jYXQkd2luZHNwZWVkLCBtZXRob2Q9ImNsdXN0ZXIiLCBicmVha3M9NCkgI0tOTgpzdW1tYXJ5KGRhdGFfY2F0JHdpbmRfY2F0X2ludCkKc3VtbWFyeShkYXRhX2NhdCR3aW5kX2NhdF9mcmUpCnN1bW1hcnkoZGF0YV9jYXQkd2luZF9jYXRfY2x1KQojWzcuNiwxOS41KTpsb3cKI1sxOS41LDI5KTogbWlkCiNbMjksNDMuNCk6IHN0cm9uZwojWzQzLjQsODIuNV06IHZlcnkgc3Ryb25nCgpkYXRhX2NhdCRwcmVfY2F0X2ludCA8LSBkaXNjcmV0aXplKGRhdGFfY2F0JHByZWNpcCwgbWV0aG9kPSJpbnRlcnZhbCIsIGJyZWFrcz00KQpkYXRhX2NhdCRwcmVfY2F0X2ZyZSA8LSBkaXNjcmV0aXplKGRhdGFfY2F0JHByZWNpcCwgbWV0aG9kPSJmcmVxdWVuY3kiLCBicmVha3M9NCkKZGF0YV9jYXQkcHJlX2NhdF9jbHUgPC0gZGlzY3JldGl6ZShkYXRhX2NhdCRwcmVjaXAsIG1ldGhvZD0iY2x1c3RlciIsIGJyZWFrcz00KSAjS05OCnN1bW1hcnkoZGF0YV9jYXQkcHJlX2NhdF9pbnQpCnN1bW1hcnkoZGF0YV9jYXQkcHJlX2NhdF9mcmUpCnN1bW1hcnkoZGF0YV9jYXQkcHJlX2NhdF9jbHUpCgpkYXRhX2NhdCRodW1fY2F0X2ludCA8LSBkaXNjcmV0aXplKGRhdGFfY2F0JGh1bWlkaXR5LCBtZXRob2Q9ImludGVydmFsIiwgYnJlYWtzPTQpCmRhdGFfY2F0JGh1bV9jYXRfZnJlIDwtIGRpc2NyZXRpemUoZGF0YV9jYXQkaHVtaWRpdHksIG1ldGhvZD0iZnJlcXVlbmN5IiwgYnJlYWtzPTQpCmRhdGFfY2F0JGh1bV9jYXRfY2x1IDwtIGRpc2NyZXRpemUoZGF0YV9jYXQkaHVtaWRpdHksIG1ldGhvZD0iY2x1c3RlciIsIGJyZWFrcz00KSAjS05OCnN1bW1hcnkoZGF0YV9jYXQkaHVtX2NhdF9pbnQpCnN1bW1hcnkoZGF0YV9jYXQkaHVtX2NhdF9mcmUpCnN1bW1hcnkoZGF0YV9jYXQkaHVtX2NhdF9jbHUpCiNbNDYuNiw2OC40KTogbGV2ZWwgMQojWzY4LjQsNzkuOCk6IGxldmVsIDIKI1s3OS44LDg4LjMpOiBsZXZlbCAzCiNbODguMyw5OC44XTogbGV2ZWwgNApgYGAKCiMgY29udmVydCB0aGUgbnVtZXJpY2FsIHZhcmlhYmxlcyBpbnRvIGNhdGVnb3JpY2FsIHZhcmlhYmxlcwpgYGB7cn0KZGF0YV9jYXQkdGVtcF9jYXQ9aWZlbHNlKGRhdGEkdGVtcDw0LCAnY29sZCcsIAogICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZGF0YSR0ZW1wPDksICdjb29sJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShkYXRhJHRlbXA8MTQsICd3YXJtJywgJ2hvdCcpKSkKZGF0YV9jYXQkd2luZF9jYXQ9aWZlbHNlKGRhdGEkd2luZHNwZWVkPDE5LjUsICdsb3cnLCAKICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGRhdGEkd2luZHNwZWVkPDI5LCAnbWlkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShkYXRhJHdpbmRzcGVlZDw0My41LCAnaGlnaCcsICdzdHJvbmcnKSkpCmBgYAoKIyBwbG90IHRoZSBjYXRlZ29yaWNhbCB2YXJpYWJsZXMgdnMgbnVtYmVyIG9mIGhvc3BpdGFsIHBhdGllbnRzCmBgYHtyfQpnZ3Bsb3QoZGF0YV9jYXQsIGFlcyh4ID0gc2VxKDEsIDQ4NSwgMSksCiAgICAgICAgICAgICAgICAgICAgIHkgPSBob3NwX3BhdGllbnRzLCAKICAgICAgICAgICAgICAgICAgICAgZ3JvdXA9dGVtcF9jYXQsIAogICAgICAgICAgICAgICAgICAgICBjb2xvcj10ZW1wX2NhdCkpICtnZW9tX3BvaW50KCkgK3hsYWIoJ2RhdGUnKQojIGNsZWFybHkgaG90IHRlbXBlcmF0dXJlIHJlc3VsdHMgbG93ZXIgQ09WSUQgaG9zcGl0YWwgcGF0aWVudHMKCmdncGxvdChkYXRhX2NhdCwgYWVzKHggPSBzZXEoMSwgNDg1LCAxKSwKICAgICAgICAgICAgICAgICAgICAgeSA9IGhvc3BfcGF0aWVudHMsIAogICAgICAgICAgICAgICAgICAgICBncm91cD13aW5kX2NhdCwgCiAgICAgICAgICAgICAgICAgICAgIGNvbG9yPXdpbmRfY2F0KSkgK2dlb21fcG9pbnQoKSAreGxhYignZGF0ZScpCiMgbm8gY2xlYXJseSB0cmVuZApgYGAKCiMgZml0IGEgbG0gdXNpbmcgY2F0ZWdvcmljYWwgZGF0YQpgYGB7cn0KbG0yPWxtKGhvc3BfcGF0aWVudHN+LiwgZGF0YT1kYXRhX2NhdFssIGMoMiwzLDUsNiwxMSwxMiwgMjUsIDI2KV0pCnN1bW1hcnkobG0yKQojIHdoZW4gdGVtcGVyYXR1cmUgaXMgaGlnaGVyIHRoYW4gOSBkZWdyZWVzLCBpdCBoYXMgYW4gZWZmZWN0IG9uIHRoZSBDT1ZJRCBob3NwaXRhbCBhZG1pc3Npb24uCiMgd2luZCBkb2VzIG5vdCBoYXZlIGFuIGltcGFjdCBvbiBob3NwaXRhbCBhZG1pc3Npb24KYGBgCgo=